//观察重定向原理
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>

int main(int argc, char *argv[])
{
    if(argc != 2) exit(1);

    //追加的方式
    //int fd = open("log.txt", O_CREAT | O_WRONLY | O_APPEND, 0666);
    
    //打开文件时，每次都清空式的进行输出重定向
    //int fd = open("log.txt", O_CREAT | O_WRONLY | O_TRUNC, 0666);

    int fd = open(argv[1], O_RDONLY);

    if(fd < 0) exit(1);  //打开失败退出


    //将1（stdout）的内容被覆盖成fd的
    //dup2(fd, 1);

    //把0（stdin）的内容覆盖成fd的
    dup2(fd, 0);


    //把fd的文件描述符对该文件的引用释放，
    //关闭一个文件描述符会释放该进程对该文件的引用。
    //如果这是指向该文件的最后一个文件描述符，则该文件将被关闭，
    //并且相关的资源（如文件句柄、内存等）将被释放。
    //如果还有其他文件描述符指向该文件，
    //则关闭其中一个文件描述符不会影响文件的状态或内容。
    //文件仍然保持打开状态，直到所有指向它的文件描述符都被关闭。
    close(fd);

    //输入重定向
    while(1)
    {
        char buffer[64];
        if(!fgets(buffer, sizeof(buffer), stdin)) break;

        printf("%s", buffer);
    }


    //默认向显示器输出
    //printf("fd: %d\n", fd);
    //printf("hello bit\n");
    //printf("hello bit\n");
    //printf("hello bit\n");

    //fprintf(stdout, "hello stdout\n");
    //fprintf(stdout, "hello stdout\n");
    //fprintf(stdout, "hello stdout\n");
    //fprintf(stdout, "hello stdout\n");
    
    //const char *msg = "hello world\n";
    //write(1, msg, strlen(msg));

    return 0;
}
